package com.dataSructure.list.linked.doubleLinked;

public class DoubleLinkedList {
    private DoubleLinkedNode head = new DoubleLinkedNode(0,"head","");

    // 返回头节点
    public DoubleLinkedNode getHead() {
        return head;
    }

    // 遍历双向链表的方法
    // 显示链表[遍历]
    public void list() {
        // 判断链表是否为空
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        // 因为头节点，不能动，因此我们需要一个辅助变量来遍历
        DoubleLinkedNode temp = head.next;
        while (true) {
            // 判断是否到链表最后
            if (temp == null) {
                break;
            }
            // 输出节点的信息
            System.out.println(temp);
            // 将temp后移， 一定小心
            temp = temp.next;
        }
    }

    public void add(DoubleLinkedNode node){

        // 因为head节点不能动，因此我们需要一个辅助遍历 temp
        DoubleLinkedNode temp = head;
        // 遍历链表，找到最后
        while (true) {
            // 找到链表的最后
            if (temp.next == null) {//
                break;
            }
            // 如果没有找到最后, 将将temp后移
            temp = temp.next;
        }
        // 当退出while循环时，temp就指向了链表的最后
        // 形成一个双向链表
        temp.next = node;
        node.pre = temp;

    }

    public void update(DoubleLinkedNode node){

        // 判断是否空
        if (head.next == null) {
            System.out.println("链表为空~");
            return;
        }

        DoubleLinkedNode temp = head.next;
        boolean flag = false;
        while (true){
            if (temp== null) break;

            if(temp.id == node.id) {  flag = true; break;}
            temp = temp.next;
        }

        if (flag){
            temp.name = node.name;
            temp.nickname = node.nickname;
        }
    }

    public void del(int id){

        // 判断是否空
        if (head.next == null) {
            System.out.println("链表为空~");
            return;
        }
        DoubleLinkedNode temp = head.next;
        boolean flag = false;
        while (true){

            if (temp == null ) break;

            if(temp.id == id) {  flag = true; break;}
            temp = temp.next;
        }

        if (flag){
            // 可以删除
            // temp.next = temp.next.next;[单向链表]
            temp.pre.next = temp.next; // 上一个的下级指针指向吓人一个
            // 如果是最后一个节点，就不需要执行下面这句话，否则出现空指针
            if (temp.next != null) {
                temp.next.pre = temp.pre; //下级的指针的上级 知向 当前的上级
            }

        }

    }

}
